﻿using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;

using BeachRunner.Tileengine;
using BeachRunner.Utility;

namespace BeachRunner.BeachRunner
{
    /// <summary>
    /// Verwaltet die BonusLayer und das Bonussystem des Spiels
    /// 
    /// Autor: Mathias Müller
    /// </summary>
    public class BonusManager : TileOperator
    {
        public SoundEffect collectBonusSpeedDown;
        public SoundEffect collectBonusSpeedUp;

        /// <summary>
        /// wird ein Speedbonus aktiviert
        /// </summary>
        private bool activateBonusSpeedUp;

        /// <summary>
        /// mach das aktivieren des Speedbonuses zugänglich
        /// </summary>
        public bool ActivateBonusSpeedUp
        {
            get { return activateBonusSpeedUp; }
            set { activateBonusSpeedUp = value; }
        }
        /// <summary>
        /// wird ein Speedmalus aktiviert
        /// </summary>
        private bool activateBonusSpeedDown;

        /// <summary>
        /// macht das aktivieren des Speedmaluses zugänglich
        /// </summary>
        public bool ActivateBonusSpeedDown
        {
            get { return activateBonusSpeedDown; }
            set { activateBonusSpeedDown = value; }
        }

        /// <summary>
        /// Wie viel Geschwindigkeit kommt dazu? in %
        /// </summary>
        private float speedBonus;
        /// <summary>
        /// Wie viel Geschwindigkeit kommt dazu? in %
        /// </summary>
        public float SpeedBonus
        {
            get { return speedBonus; }
            set { speedBonus = value; }
        }
        /// <summary>
        /// Wie viel Geschwindigkeit wird abgezogen?
        /// </summary>
        private float speedMalus;
        /// <summary>
        /// Wie viel Geschwindigkeit wird abgezogen?
        /// </summary>
        public float SpeedMalus
        {
            get { return speedMalus; }
            set { speedMalus = value; }
        }

        /// <summary>
        /// Hält die noch im Spiel befindlichen Boni
        /// </summary>
        private Layer bonusLayer;
        /// <summary>
        /// Macht die noch im Spiel befindlichen Boni zugänglich
        /// </summary>
        public Layer BonusLayer
        {
            get { return bonusLayer; }
        }


        public BonusManager() 
        {
            speedBonus = 1.1f;
            speedMalus = 0.85f;
        }

        public void LoadContent(ContentManager contentManager)
        {
            collectBonusSpeedDown = contentManager.Load<SoundEffect>("sfx\\bonusSpeedDown");
            collectBonusSpeedUp = contentManager.Load<SoundEffect>("sfx\\bonusSpeedUp");
        }

        public void Draw(SpriteBatch spriteBatch)
        {
        }

        /// <summary>
        /// Setzt die im Spiel befindlichen Boni zurück ( alle Boni wieder da )
        /// </summary>
        /// <param name="map">Die zu verwendende Map</param>
        public void Reset(Map map)
        {
            int indexLayerBonus;

            map.NameToLayer.TryGetValue("bonus", out indexLayerBonus);

            Reset(map.Layer[indexLayerBonus]);
        }

        /// <summary>
        /// Setzt die im Spiel befindlichen Münzen zurück ( alle Münzen wieder da )
        /// </summary>
        /// <param name="layer">Das zu verwendende Layer</param>
        public void Reset(Layer layer)
        {
            this.bonusLayer = new Layer(layer);      
        }

        private const int INDEX_BONUSSPEEDUP_TILE = 121;
        private const int INDEX_BONUSSPEEDDOWN_TILE = 122;

        public void Operate(int x, int y)
        {
            int index = y * bonusLayer.Width + x;
            if (index < 0 || index >= bonusLayer.Data.Length)
            {
                return;
            }

            if (bonusLayer.Data[index] == INDEX_BONUSSPEEDUP_TILE)
            {
                bonusLayer.Data[index] = 0;

                AddSpeedUp();

                if (Game1.Config.Sound_effects)
                {
                    collectBonusSpeedUp.Play();
                }
                    
            }
            if (bonusLayer.Data[index] == INDEX_BONUSSPEEDDOWN_TILE)
            {
                bonusLayer.Data[index] = 0;

                AddSpeedDown();

                if (Game1.Config.Sound_effects)
                {
                    collectBonusSpeedDown.Play();
                }

            }
        }

        /// <summary>
        /// Aktiviert den Bonus Speed Up 
        /// Positive Boni bringen mehr Punkte
        /// </summary>
        public void AddSpeedUp()
        {
            activateBonusSpeedUp = true;
            Game1.ScoreManager.Scores += 10;
        }

        /// <summary>
        /// Aktiviert den Bonus Speed Down 
        /// Negative Boni bringen weniger Punkte
        /// </summary>
        public void AddSpeedDown()
        {
            activateBonusSpeedDown = true;
            Game1.ScoreManager.Scores -= 5;
        }

        public void Update() {}
    }
}
